package com.example.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 跨域问题第二种解决方式
 */

/**
 * 加上 @Configuration，Spring Boot 启动时自动加载，无需其他设置！
 */
//@Configuration
public class CrosConfig implements WebMvcConfigurer {

    /**
     * allowCredentials(true) 时，不能将 allowedOrigins("*") 设置为通配符 "*"，否则浏览器报错
     * 1. Access-Control-Allow-Origin: * 是不安全的“全放开”
     * 这个意思是：任何人（任何网站）都可以访问你的接口。
     * 如果允许同时携带 Cookie，等于说：
     * “我不管你是谁，拿了我的用户的登录态 Cookie 都能用！”
     * 2. Access-Control-Allow-Credentials: true 是“我要让你带 Cookie”
     * 浏览器会将用户的登录凭证（Cookie / Session）附带给后端。
     * 后端如果不限制来源，Cookie 就可能被“别的网站”利用，造成伪造请求。
     * 所以标准规定：
     * 当你允许携带 Cookie 时，必须明确告诉浏览器：只允许“谁”可以跨域访问。不能谁都行（不能用 *）。
     * 如果“全放开”且“允许携带 Cookie”，后果是非常严重的！
     * 如果你选择不让带 Cookie，那就要使用其他的身份认证方式 —— Token
     * ✅ 带 Cookie 的请求自动携带身份，若全放开就可能遭遇伪造攻击（CSRF），所以标准强制要求必须指定允许来源。
     * ✅ 不带 Cookie 时，需要你手动在请求中传入 Token 等身份信息，更灵活、安全。
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry
                // 允许跨域的路径（/** 表示所有接口）
                .addMapping("/**")
                // 允许哪些域名发起跨域请求（可指定多个）
                .allowedOrigins("*")
                // 允许的 HTTP 方法，如 GET、POST
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                // 允许的请求头，如 Content-Type、Authorization
                .allowedHeaders("*")
                // 是否允许携带 Cookie（注意不能配合 "*"）
                .allowCredentials(false)
                // 设置浏览器对预检请求（OPTIONS）的缓存时间（单位：秒）
                .maxAge(3600);
    }

}
